#define xuser mixc::powerful_cat
#include"lang/cxx/align_center.hpp"
#include"lang/cxx.hpp"
#include"mixc.hpp"
#include"utils/static_length_of.hpp"
#include"utils/temp_allocator.hpp"

// 两种分配方案
#define xuse_temp_allocator 0

xinit(xuser::the_main){
    using namespace xuser;

#if xuse_temp_allocator
    // temp_allocator 是个分配的内存是临时内存，出了作用域就释放了，c08 指向的内容将无效
    temp_allocator memory;
    auto alloc      = memory.item_as<char>();
#else
    // 注意：
    // 每次返回的地址是一样的，所以是新值覆盖旧值的逻辑
    // 这种方式使用有一些限制，但性能好一些
    char buf[128];
    auto alloc = [&](uxx length) -> char * { // 需要指定缓冲区类型
        if (length > static_length_of(buf)){ // 检查缓冲区大小是一个好习惯
            // 返回 null 并不会导致异常，只是会终止分配后续的操作，如果没有特殊要求，则会生成空串
            return nullptr;
        }
        return buf;
    };
#endif

    c08 origin_str  = "hello";

    // 刻度
    c08 s           = "0123456789abcdef";

    // 宽度 16 个字符，让字符串居中并在两端填充空格
    c08 v           = origin_str.align_center(16, alloc/*这里都是复用缓冲区*/);

    xhint(s);
    xhint(v);

    // 如果指定的宽度小于串长度，则会产生截断
    v               = origin_str.align_center(origin_str->length - 1, alloc);

    xhint(s);
    xhint(v);

    // 设置两边填充的字符
    v               = origin_str.align_center(16, '-', alloc);

    xhint(s);
    xhint(v);

    // 设置两边填充的字符
    v               = origin_str.align_center(16, '-'/*左边*/, '+'/*右边*/, alloc);

    xhint(s);
    xhint(v);

    // 来点欢乐的
    origin_str      = "我"; // 不知所措
    v               = origin_str.align_center(16, '?', alloc);

    xhint(s);
    xhint(v);
};
